Virtualization environments provide multiple virtual machines (VM's) on a physical “host” machine, with each VM appearing to be a full computer to “guest” software running inside the VM. Virtualization software (e.g., a hypervisor) enables a user to concurrently run multiple copies of a guest operating system on one physical machine, with each guest operating system having its own copy of “virtual hardware.” For example, a virtualization environment may virtualize a physical device using a split driver model. A front end driver within a VM advertises itself to the guest software, accepts system calls from the guest software, and routes the requests to a back end driver within the hypervisor. The back end driver translates and forwards the system calls to a vendor driver associated with the physical device.
The abstraction provided by the virtualization and split driver model enables multiple VM's to share a single physical device while enabling a VM to be migrated from one host machine to another host machine. The split driver solution, however, suffers overhead costs of the translation performed by the back end driver and is limited to those physical devices that have custom drivers for virtualization software. To avoid translation overhead and the limitation posed by custom drivers, a physical device may be exposed directly to a VM via “guest device pass-through.” Guest device pass-through, however, involves a one-to-one binding between the physical device and the VM while complicating or preventing migration of the VM bound to the physical device.